package com.atguigu.resp;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 统一结果返回封装类，用于封装接口返回的数据结构
 * @param <T> 返回数据的泛型类型
 */
@Data
@Accessors(chain = true) //启用链式调用,当设置 chain = true 时，生成的setter方法会返回当前对象实例（this）
public class ResultData<T> {
    /**
     * 返回状态码
     */
    private String code;

    /**
     * 返回消息描述
     */
    private String msg;

    /**
     * 返回的具体数据
     */
    private T data;

    /**
     * 时间戳
     */
    private Long Timestamp;

    /**
     * 链路追踪ID
     */
    private String traceId;

    /**
     * 构造函数，初始化时间戳为当前系统时间
     */
    public ResultData() {
        this.Timestamp = System.currentTimeMillis();
    }

    /**
     * 创建成功的返回结果
     * @param data 返回的具体数据
     * @param <T> 数据类型泛型
     * @return 成功的返回结果对象
     */
    public static <T> ResultData<T> success(T data) {
        return new ResultData<T>().setCode(ReturnCodeEnum.RC200.getCode()).setMsg(ReturnCodeEnum.RC200.getMessage()).setData(data);
    }

    /**
     * 创建失败的返回结果
     * @param code 错误状态码
     * @param msg 错误消息
     * @param <T> 数据类型泛型
     * @return 失败的返回结果对象
     */
    public static <T> ResultData<T> fail(String code, String msg) {
        return new ResultData<T>().setCode(code).setMsg(msg);
    }

    /**
     * 创建失败的返回结果
     * @param returnCodeEnum 返回码枚举对象
     * @param <T> 数据类型泛型
     * @return 失败的返回结果对象
     */
    public static <T> ResultData<T> fail(ReturnCodeEnum returnCodeEnum) {
        return new ResultData<T>().setCode(returnCodeEnum.getCode()).setMsg(returnCodeEnum.getMessage());
    }
}

